<?php
namespace app\lib\exception;

use think\Exception;
use think\exception\Handle;
// use think\exception\HttpException;  //与think\Exception不是一个继承关系。
use think\Request;
use think\Log;

// 把异常处理类库处理方法
class ExceptionHandler extends Handle
{
	private $code;
    private $msg;
   	private $errorCode;

   	// 将这个方法注释掉的话，就会恢复TP5默认的异常处理。
   	// \Exception使用基类Exception，需要加上\
   	// use think\Exception的Excepion与上面基类的"\Exception"是不一样的
	public function render(\Exception $e)   //重写render方法，自定义异常处理
	{
		// return json('~~~~~~~');

		// 需要返回客户端当前请求的URL路径
		
		if($e instanceof BaseException){
			//如果是自定义的异常
			$this->code = $e->code;
			$this->msg = $e->msg;
			$this->errorCode =$e->errorCode;
		}else{
			// Config::get('app_debug');
			if(config('app_debug')){   //通过读取配置文件中的调试，来判断是开发环境，还是生产环境。
				// return default error page
				// 返回框架默认异常页面。
				return parent::render($e);//直接调用父类原来的方法。恢复默认。
			}else{
				$this->code = 500;
				$this->msg = '服务器内部错误， 不想告诉你';
				$this->errorCode = 999;
				$this->recordErrorLog($e);
			}
			
		}
		$request = Request::instance();
		$result = [
			'msg' => $this->msg,
			'error_code' => $this->errorCode,
			'request_url' => $request->url()//获取请求路径
		];
		return json($result, $this->code);
	}

	private function recordErrorLog(\Exception $e){
		// 初始化日志记录，之前已关闭系统的自动记录日志。 才能记录日志
		Log::init([
			'type' => 'File',
			'path' => LOG_PATH,
			'level' => ['error']   //高物error级别的，才会被记录
		]);
		Log::record($e->getMessage(), 'error');
	}
}